package com.wuxi.common.config;

import com.wuxi.common.exception.exceptionInfo.CacheException;
import com.wuxi.common.handler.LoadAllVehicleHandler;
import com.wuxi.common.pojo.VehicleInfo;
import com.wuxi.common.utils.CacheUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

import java.util.List;

@Slf4j
@Component // 确保被Spring扫描到（原@Configuration可保留，若仅做初始化用，@Component更语义化）
@RequiredArgsConstructor
public class InitApplicationConfig {

    private final LoadAllVehicleHandler loadAllVehicleHandler;
    private final CacheUtils cacheUtils;

    // 标记是否已执行，避免重复执行（防止容器重启等场景下多次触发）
    private boolean hasInitialized = false;

    /**
     * 监听「Spring应用就绪事件」：容器完全启动、所有Bean都初始化完成后执行
     * 替代@PostConstruct，确保依赖的Bean（如cacheUtils、loadAllVehicleHandler）已完全可用
     */
    @EventListener(ApplicationReadyEvent.class)
    public void initVehicleAfterStartup() {
        // 避免重复执行（关键：ApplicationReadyEvent可能在某些场景下触发多次）
        if (hasInitialized) {
            log.info("小车状态初始化已执行过，无需重复执行");
            return;
        }

        log.info("=== 程序启动完成，开始初始化小车状态缓存 ===");
        try {
            // 1. 从数据库查询所有小车信息（增加空值校验，避免后续遍历NPE）
            List<VehicleInfo> vehicleInfoList = loadAllVehicleHandler.getAllVehicleInfo();
            if (vehicleInfoList == null || vehicleInfoList.isEmpty()) {
                log.warn("数据库中未查询到小车信息，缓存初始化跳过");
                hasInitialized = true;
                return;
            }

            // 2. 批量写入缓存（若缓存支持批量操作，可替换为批量方法提升性能）
            int successCount = 0;
            for (VehicleInfo vehicleInfo : vehicleInfoList) {
                // 校验小车ID非空，避免无效缓存键
                if (vehicleInfo.getVehicleId() == null || vehicleInfo.getVehicleId().trim().isEmpty()) {
                    log.warn("跳过无效小车信息：VehicleId为空");
                    continue;
                }
                cacheUtils.put("allVehicleStatus", vehicleInfo.getVehicleId(), vehicleInfo);
                successCount++;
            }

            // 3. 记录执行结果，便于问题排查
            log.info("小车状态缓存初始化完成：共查询到{}辆小车，成功缓存{}辆",
                    vehicleInfoList.size(), successCount);
            hasInitialized = true;

        } catch (CacheException e) {
            // 捕获缓存相关异常，明确错误类型
            log.error("小车状态缓存写入失败，需检查缓存服务是否可用", e);
            // 若初始化是核心流程，可抛出异常终止启动；非核心则标记失败后继续
            // throw new RuntimeException("小车状态初始化失败，程序启动中止", e);
        } catch (Exception e) {
            // 捕获数据库查询等其他异常
            log.error("小车状态初始化异常（含数据库查询/数据处理）", e);
            // 按需决定是否终止启动
        }
    }
}
